﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Text;

namespace BGCOP.CAVTOP.BUSINESSLAYER
{
    public class Reportes
    {
        public List<reporteEmpleadoDTO> consultarReporteEmpleados(DateTime fecha1,
                                                                  DateTime fecha2,
                                                                  int idEmpresa, int idempleado)
        {
            using (masterDBACEntities db = new masterDBACEntities())
            {
                if (idEmpresa == -999)
                {
                    //se mira el empleado
                    if (idempleado == -999)
                    {
                        //se listan todos los empleados de todas las empresas
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TEmpleado on a.idEmpleado equals b.idEmpleado
                                        join c in db.TEmpresa on b.idEmpresa equals c.idEmpresa
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 
                                        orderby a.fechaMarcacion 
                                        select new reporteEmpleadoDTO()
                                                   {
                                                       Empresa = c.RazonSocial,
                                                       Fecha_Marcacion = (DateTime) a.fechaMarcacion,
                                                       Identificacion = b.identificacion,
                                                       Nombre = b.nombre
                                                   }).ToList();
                        return sqlQuery;
                    }
                    else
                    {
                        //se lista solo el empleado selccionado 
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TEmpleado on a.idEmpleado equals b.idEmpleado
                                        join c in db.TEmpresa on b.idEmpresa equals c.idEmpresa
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 && 
                                        b.idEmpleado == idempleado
                                        orderby a.fechaMarcacion
                                        select new reporteEmpleadoDTO()
                                        {
                                            Empresa = c.RazonSocial,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion,
                                            Identificacion = b.identificacion,
                                            Nombre = b.nombre
                                        }).ToList();
                        return sqlQuery;
                    }
                }
                else
                {
                    //se mira el empleado
                    if (idempleado == -999)
                    {
                        //se listan todos los empleados de la empresa selecionada
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TEmpleado on a.idEmpleado equals b.idEmpleado
                                        join c in db.TEmpresa on b.idEmpresa equals c.idEmpresa
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 &&
                                        c.idEmpresa == idEmpresa 
                                        orderby a.fechaMarcacion
                                        select new reporteEmpleadoDTO()
                                        {
                                            Empresa = c.RazonSocial,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion,
                                            Identificacion = b.identificacion,
                                            Nombre = b.nombre
                                        }).ToList();
                        return sqlQuery;
                    }
                    else
                    {
                        //se lista solo el empleado de la empresa seleccionada
                        //se lista solo el empleado selccionado 
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TEmpleado on a.idEmpleado equals b.idEmpleado
                                        join c in db.TEmpresa on b.idEmpresa equals c.idEmpresa
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 &&
                                        b.idEmpleado == idempleado
                                        orderby a.fechaMarcacion
                                        select new reporteEmpleadoDTO()
                                        {
                                            Empresa = c.RazonSocial,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion,
                                            Identificacion = b.identificacion,
                                            Nombre = b.nombre
                                        }).ToList();
                        return sqlQuery;
                    }
                }

            }
            return null;
        }
        public List<reporteVisitanteDTO> consultarReporteVisitantes(DateTime fecha1,
                                                                  DateTime fecha2,
                                                                  int idEmpresaDestino, int idVisitante)
        {
            using (masterDBACEntities db = new masterDBACEntities())
            {
                if (idEmpresaDestino == -999)
                {
                    //se mira el empleado
                    if (idVisitante == -999)
                    {
                        //se listan todos los visitantes de todas las empresas
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TVisitante on a.idVisitante equals b.idVisitante 
                                        join c in db.TVisitanteVisitaProgramada on a.idVisitanteVistaP equals c.idVisitaProgramada
                                        join d in db.TVisitaProgramada on c.idVisitaProgramada equals d.idVisitaProgramada
                                        join e in db.TEmpresa on d.idEmpresa equals e.idEmpresa 
                                        join f in db.TEmpleado on d.idEmpleado equals f.idEmpleado 
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2
                                        orderby a.fechaMarcacion
                                        select new reporteVisitanteDTO()
                                        {
                                            idvisitante = (decimal)a.idVisitante,
                                            Identificacion = b.identificacionVisitante,
                                            Nombre_Visitante = b.nombreVisitante,
                                            Empresa_Destino = e.RazonSocial,
                                            Empleado_Destino = f.nombre,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion
                                        }).ToList();
                        return sqlQuery;
                    }
                    else
                    {
                        //se lista solo el visitante selccionado 
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TVisitante on a.idVisitante equals b.idVisitante
                                        join c in db.TVisitanteVisitaProgramada on a.idVisitanteVistaP equals c.idVisitaProgramada
                                        join d in db.TVisitaProgramada on c.idVisitaProgramada equals d.idVisitaProgramada
                                        join e in db.TEmpresa on d.idEmpresa equals e.idEmpresa
                                        join f in db.TEmpleado on d.idEmpleado equals f.idEmpleado
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 &&
                                        b.idVisitante == idVisitante 
                                        orderby a.fechaMarcacion
                                        select new reporteVisitanteDTO()
                                        {
                                            idvisitante = (decimal)a.idVisitante,
                                            Identificacion = b.identificacionVisitante,
                                            Nombre_Visitante = b.nombreVisitante,
                                            Empresa_Destino = e.RazonSocial,
                                            Empleado_Destino = f.nombre,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion
                                        }).ToList();
                        return sqlQuery;
                    }
                }
                else
                {
                    //se mira el empleado
                    if (idVisitante == -999)
                    {
                        //se listan todos los empleados de la empresa selecionada
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TVisitante on a.idVisitante equals b.idVisitante
                                        join c in db.TVisitanteVisitaProgramada on a.idVisitanteVistaP equals c.idVisitaProgramada
                                        join d in db.TVisitaProgramada on c.idVisitaProgramada equals d.idVisitaProgramada
                                        join e in db.TEmpresa on d.idEmpresa equals e.idEmpresa
                                        join f in db.TEmpleado on d.idEmpleado equals f.idEmpleado
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 &&
                                        e.idEmpresa == idEmpresaDestino 
                                        orderby a.fechaMarcacion
                                        select new reporteVisitanteDTO()
                                        {
                                            idvisitante = (decimal)a.idVisitante,
                                            Identificacion = b.identificacionVisitante,
                                            Nombre_Visitante = b.nombreVisitante,
                                            Empresa_Destino = e.RazonSocial,
                                            Empleado_Destino = f.nombre,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion
                                        }).ToList();
                        return sqlQuery;
                    }
                    else
                    {
                        //se lista solo el empleado de la empresa seleccionada
                        //se lista solo el empleado selccionado 
                        var sqlQuery = (from a in db.TMarcacion
                                        join b in db.TVisitante on a.idVisitante equals b.idVisitante
                                        join c in db.TVisitanteVisitaProgramada on a.idVisitanteVistaP equals c.idVisitaProgramada
                                        join d in db.TVisitaProgramada on c.idVisitaProgramada equals d.idVisitaProgramada
                                        join e in db.TEmpresa on d.idEmpresa equals e.idEmpresa
                                        join f in db.TEmpleado on d.idEmpleado equals f.idEmpleado
                                        where a.fechaMarcacion >= fecha1 && a.fechaMarcacion <= fecha2 &&
                                        b.idVisitante == idVisitante
                                        orderby a.fechaMarcacion
                                        select new reporteVisitanteDTO()
                                        {
                                            idvisitante = (decimal) a.idVisitante, 
                                            Identificacion = b.identificacionVisitante,
                                            Nombre_Visitante = b.nombreVisitante,
                                            Empresa_Destino = e.RazonSocial,
                                            Empleado_Destino = f.nombre,
                                            Fecha_Marcacion = (DateTime)a.fechaMarcacion
                                        }).ToList();
                        return sqlQuery;
                    }
                }

            }
            return null;
        }
    }

    public class reporteEmpleadoDTO
    {
        public string Empresa { get; set; }
        public string Identificacion { get; set; }
        public string Nombre { get; set; }
        public DateTime Fecha_Marcacion { get; set; }
    }
    public class reporteVisitanteDTO
    {
        public decimal idvisitante { get; set; }
        public string Identificacion { get; set; }
        public string Nombre_Visitante { get; set; }
        public string Empresa_Destino { get; set; }
        public string Empleado_Destino { get; set; }
        public DateTime Fecha_Marcacion { get; set; }
    }

}
